def read_text(filename):
    text=open(filename,"rt",encoding="utf-8").read()
    for c in "abcdefghijklmnopqrstuvwxyz"\
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
     "~!@#$%^&*()_+=-`[]\{}|:\";',./<>?，。、 "\
     "《》？；’：”“【】、｛｝§=-+——）（*&……%￥#@！～·\n\t":
        text=text.replace(c,"")#删去符号等无用统计项
    return text

def stat_char(text): # 构造字典，以汉字为键，以其出现次数为值
    chars={}
    for c in text:    # 若该字符为首次出现，增加键，构造字典，以字符为键，以其出现次数为值
        chars[c]=chars.get(c,0)+1
        result=list(chars.items()) # 由字典构造列表    # 以字符出现频率排序，降序        # lambda 表达式参数 x 接收到该元素    # 返回该元素（元组）的第 1 项（字频统计值）作为 sort() 函数比较依据
    result.sort(key=lambda x:x[1],reverse=True)# key 为用户定义的回调函数，用于指定比较大小关系的数据对象    # sort() 函数执行时，传递待排序序列的元素给用户定义的 lambda 表达式
    return result

filename="三体.txt"
text=read_text(filename)
conclusion=stat_char(text)
print("总字数：", len(text))# 输出数据
print("用字数：", len(conclusion))
print("最常用百字频率如下：")
for i in range(100):
    print("{}：{:>5d}".format(*conclusion[i]))# conclusion[i] 为元组，解包后传递给字符串的 format() 方法